package com.lei.emos.wx.config.shiro;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@Slf4j
public class JwtUtil {
    //密钥
    @Value("${emos.jwt.secret}")
    private String secret;

    //过期时间
    @Value("${emos.jwt.expire}")
    private String expire;

    /**
     * 创建token
     * @param userId
     * @return
     */
    public String createToken(int userId){
        //计算根据当前时间+过期时间后的时间
        Date date = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, Integer.parseInt(expire));
        //对密钥进行加密
        Algorithm algorithm = Algorithm.HMAC256(secret);
        //创建JWTCreator.Builder 内部类
        JWTCreator.Builder builder = JWT.create();
        //绑定userId 过期时间 以及加密算法的对象 反正为token
        String token = builder.withClaim("userId",userId).withExpiresAt(date).sign(algorithm);
        return token;
    }

    /**
     * 对令牌字符串进行解码 获取userId
     * @param token
     * @return
     */
    public int getUserId(String token){
        //创建解码对象
        DecodedJWT jwt = JWT.decode(token);
        //获取到userId
        int userId = jwt.getClaim("userId").asInt();
        return userId;
    }

    /**
     * 校验令牌字符串
     * 如果加密方式 内容 没问题 以及时间没过期 不会抛出异常
     * 否则就会出现  RuntimeException 异常
     * @param token
     */
    public void verifierToken(String token){
        //创建算法对象
        Algorithm algorithm = Algorithm.HMAC256(secret);
        //算法对象解析解密
        JWTVerifier verifier = JWT.require(algorithm).build();
        //验证token
        verifier.verify(token);
    }
}
